﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//namespace Yusei
//{
//	// 定义一个模板类型的静态数组
//	template<class T, size_t N>
//	class array
//	{
//	public:
//		T& operator[](size_t index) { return _array[index]; }
//		const T& operator[](size_t index)const { return _array[index]; }
//
//		size_t size()const { return _size; }
//		bool empty()const { return 0 == _size; }
//
//	private:
//		T _array[N];
//		size_t _size;
//	};
//}
// 函数模板 -- 参数匹配
//template<class T>
//bool Less(T left, T right)
//{
//	return left < right;
//}
//int main()
//{
//	cout << Less(1, 2) << endl;   // 可以比较，结果正确
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 8);
//	cout << Less(d1, d2) << endl;  // 可以比较，结果正确
//	Date* p1 = &d1;
//	Date* p2 = &d2;
//	cout << Less(p1, p2) << endl;  // 可以比较，结果错误
//	return 0;
//}

// 函数模板 -- 参数匹配
//template<class T>
//bool Less(T left, T right)
//{
//	return left < right;
//}
//// 对Less函数模板进行特化
//template<>
//bool Less<Date*>(Date* left, Date* right)
//{
//	return *left < *right;
//}
//
//bool Less(Date* left, Date* right)
//{
//	return *left < *right;
//}
//int main()
//{
//	cout << Less(1, 2) << endl;
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 8);
//	cout << Less(d1, d2) << endl;
//	Date* p1 = &d1;
//	Date* p2 = &d2;
//	cout << Less(p1, p2) << endl;// 调用特化之后的版本，而不走模板生成了
//	return 0;
//}
//int main()
//{
//	Yusei::array<int,5> x;
//	return 0;
//}
//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
//template<>
//class Data<int, char>
//{
//public:
//	Data() { cout << "Data<int, char>" << endl; }
//private:
//	int _d1;
//	char _d2;
//};
//
//// 将第二个参数特化为int
//template <class T1>
//class Data<T1, int>
//{
//private:
//	T1 _d1;
//	int _d2;
//};	

//#include<vector>
//#include<algorithm>
//template<class T>
//struct Less
//{
//	bool operator()(const T& x, const T& y) const
//	{
//		return x < y;
//	}
//};
//int main()
//{
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 6);
//	Date d3(2022, 7, 8);
//	vector<Date> v1;
//	v1.push_back(d1);
//	v1.push_back(d2);
//	v1.push_back(d3);
//	// 可以直接排序，结果是日期升序
//	sort(v1.begin(), v1.end(), Less<Date>());
//	vector<Date*> v2;
//	v2.push_back(&d1);
//	v2.push_back(&d2);
//	v2.push_back(&d3);
//
//	// 可以直接排序，结果错误日期还不是升序，而v2中放的地址是升序
//	// 此处需要在排序过程中，让sort比较v2中存放地址指向的日期对象
//	// 但是走Less模板，sort在排序时实际比较的是v2中指针的地址，因此无法达到预期
//	sort(v2.begin(), v2.end(), Less<Date*>());
//	return 0;
//}

// a.h
//template<class T>
//T Add(const T& left, const T& right);
//// a.cpp
//template<class T>
//T Add(const T& left, const T& right)
//{
//	return left + right;
//}
//// main.cpp
//#include"a.h"
//int main()
//{
//	Add(1, 2);
//	Add(1.0, 2.0);
//
//	return 0;
//}